#include <linux/init.h>
#include <linux/module.h>
#include <linux/err.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/kobject.h>


// 定义三个kobject指针变量
struct kobject *mykobject01;
struct kobject *mykobject02;
struct kobject *mykobject03;


// //定义了一个kobj_type结构体变量, 用于描述kobject类型
struct kobj_type mykobj_type;



static int __init mykobject_init(void)
{   
    int ret = 0;
    printk(KERN_EMERG "mykobject_init OK!\n");

    // 创建kobject 的第一种方法
    // 创建并添加了名为"mykobject01"的kobject 对象，父kobject 为NULL    
    mykobject01 = kobject_create_and_add("mykobject_01", NULL);
    if (!mykobject01)
    {
        ret = -ENOMEM;
        goto init_error;
    }
    // 创建并添加了名为"mykobject02"的kobject 对象，父kobject 为mykobject01。
    mykobject02 = kobject_create_and_add("mykobject_02", mykobject01);
    if (!mykobject02)
    {
        ret = -ENOMEM;
        goto error_create_kobject02;
    }
     // 创建kobject 的第二种方法
    // 1 使用kzalloc 函数分配了一个kobject对象的内存
    mykobject03 = kzalloc(sizeof(struct kobject), GFP_KERNEL);
    if (!mykobject03)
    {
        ret = -ENOMEM;
        goto error_kzalloc_kobject03;
    }
    // 2 初始化并添加到内核中，名为"mykobject03", 父节点kobject为NULL。
    ret = kobject_init_and_add(mykobject03, &mykobj_type, NULL, "%s", "mykobject_03");
    if (ret)
    {
        goto error_kobject_init;
    }
    return 0;

error_kobject_init:
    kfree(mykobject03);
error_kzalloc_kobject03:
    kobject_put(mykobject02);
error_create_kobject02:
    kobject_put(mykobject01);
init_error:
    return ret;
}



static void __exit mykojbect_exit(void)
{
   // 释放之前创建的kobject对象
   kobject_put(mykobject02);
   kobject_put(mykobject01);
   kobject_put(mykobject03);


    printk(KERN_EMERG "mykojbect_exit OK!\n");
}



module_init(mykobject_init);
module_exit(mykojbect_exit);

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Treasure1029");
